計算物理学における根本的な摩擦は、コンピュータが実数を 2進浮動小数点演算という形式で表現しているため生じます。人間の10進法(十進法)的な思考とは異なり、ハードウェアは値を2進法(バイナリ)で保存します。これにより、 漏れのある抽象化という現象が生じます。たとえば0.1のような単純な小数は正確に表現できません。
1. 浮動小数点の現実
Goでは実数用に2つの主要な型を提供しています: float32 および float64。短い変数宣言構文である price := 0.0を使用する場合、Goはデフォルトで float64を使います。これらの型は正確な数学的値ではなく、現実の近似値です。
2. 0.1の謎
10進法では$1/3$は無限に繰り返す小数($0.333...$)になります。2進法では0.1という値は 無限に繰り返す分数という形になります。コンピュータのメモリは有限なので、この分数は切り捨てられ、累積誤差が生じます。たとえば$0.1 + 0.2$は正確な$0.3$ではなく、$0.30000000000000004$になります。
警告: 論理回路で浮動小数点数を比較する際には == を使ってはいけません。これらの微細な差異によって比較が失敗するからです。
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>